#ifndef GraphicsAdapter_h
#define GraphicsAdapter_h

#include <Defines.h>
#include <CSharpPropertyMethods.h>

// Riccsson includes.
#include <System/Object.h>
#include <System/IDisposable.h>
#include <System/IntPtr.h>
#include <System/Type.h>
#include <System/String.h>
#include <System/NotImplementedException.h>
#include <System/Collections/ObjectModel/ReadOnlyCollection.h>
#include <System/Guid.h>
#include <System/Version.h>

// XNA includes.
#include "PresentationParameters.h"
#include "GraphicsProfile.h"
#include "DisplayMode.h"
#include "DisplayModeCollection.h"

namespace Riccsson
{
	namespace Xna
	{
		namespace Framework
		{
			namespace Graphics
			{
				class GraphicsAdapter sealed
					: Riccsson::System::IDisposable
				{
					private: static GC_PTR<Riccsson::System::Collections::ObjectModel::ReadOnlyCollection<GC_PTR<GraphicsAdapter>>> adapters;
        
					PROP3(GraphicsAdapter, GC_PTR<DisplayMode>, CurrentDisplayMode)
					PROP3_STATIC(GraphicsAdapter, GC_PTR<GraphicsAdapter>, DefaultAdapter)
					PROP3_STATIC(GraphicsAdapter, GC_PTR<Riccsson::System::Collections::ObjectModel::ReadOnlyCollection<GC_PTR<GraphicsAdapter>>>, Adapters)
        
					COPY_CONSTRUCTOR(GraphicsAdapter)
					{
						PROP3_INIT_COPY(GraphicsAdapter, GC_PTR<DisplayMode>, CurrentDisplayMode);
					}

			#if MONOMAC
					private: NSScreen _screen;
					public: /*internal*/ GraphicsAdapter(NSScreen screen)
					{
						_screen = screen;
					}
			#elif IOS
					private: UIScreen _screen;
					public: /*internal*/ GraphicsAdapter(UIScreen screen)
					{
						_screen = screen;
					}
			#else
					public: /*internal*/ GraphicsAdapter()
						: PROP3_INIT(GraphicsAdapter, CurrentDisplayMode)
					{
					}
			#endif
        
					public: void Dispose()
					{
					}

					public: PROP3_GET(GC_PTR<DisplayMode>, CurrentDisplayMode)
					{
						throw;
					}
					private: PROP3_SET(GC_PTR<DisplayMode>, CurrentDisplayMode){throw;}

					public: static PROP3_GET(GC_PTR<GraphicsAdapter>, DefaultAdapter)
					{
						return Adapters->at(0);
					}
					private: static PROP3_SET(GC_PTR<GraphicsAdapter>, DefaultAdapter){throw;}
        
					public: static PROP3_GET(GC_PTR<Riccsson::System::Collections::ObjectModel::ReadOnlyCollection<GC_PTR<GraphicsAdapter>>>, Adapters)
					{
						throw;
					} 
					private: static PROP3_SET(GC_PTR<Riccsson::System::Collections::ObjectModel::ReadOnlyCollection<GraphicsAdapter>>, Adapters){throw;}
        

					public: bool QueryRenderTargetFormat(
						GraphicsProfile graphicsProfile,
						SurfaceFormat format,
						DepthFormat depthFormat,
						int multiSampleCount,
						SurfaceFormat out selectedFormat,
						DepthFormat out selectedDepthFormat,
						int out selectedMultiSampleCount)
					{
						throw Riccsson::System::NotImplementedException();
					}

					public: PROP3_GET(GC_PTR<Riccsson::System::string>, Description)
					{
						throw Riccsson::System::NotImplementedException();
					}
					private: PROP3_SET(GC_PTR<Riccsson::System::string>, Description){throw;}

					public: PROP3_GET(int, DeviceId)
					{
						throw Riccsson::System::NotImplementedException();
					}
					private: PROP3_SET(int, DeviceId){throw;}

					public: PROP3_GET(Riccsson::System::Guid, DeviceIdentifier)
					{
						throw Riccsson::System::NotImplementedException();
					}
					private: PROP3_SET(Riccsson::System::Guid, DeviceIdentifier){throw;}

					public: PROP3_GET(GC_PTR<Riccsson::System::string>, DeviceName)
					{
						throw Riccsson::System::NotImplementedException();
					}
					private: PROP3_SET(GC_PTR<Riccsson::System::string>, DeviceName){throw;}

					public: PROP3_GET(GC_PTR<Riccsson::System::string>, DriverDll)
					{
						throw Riccsson::System::NotImplementedException();
					}
					private: PROP3_SET(GC_PTR<Riccsson::System::string>, DriverDll){throw;}

					public: PROP3_GET(Riccsson::System::Version, DriverVersion)
					{
						throw Riccsson::System::NotImplementedException();
					}
					private: PROP3_SET(Riccsson::System::Version, DriverVersion){throw;}

					public: PROP3_GET(bool, IsDefaultAdapter)
					{
						throw Riccsson::System::NotImplementedException();
					}
					private: PROP3_SET(bool, IsDefaultAdapter){throw;}

					public: PROP3_GET(bool, IsWideScreen)
					{
						throw Riccsson::System::NotImplementedException();
					}
					private: PROP3_SET(bool, IsWideScreen){throw;}

					public: PROP3_GET(Riccsson::System::IntPtr, MonitorHandle)
					{
						throw Riccsson::System::NotImplementedException();
					}
					private: PROP3_SET(Riccsson::System::IntPtr, MonitorHandle){throw;}

					public: PROP3_GET(int, Revision)
					{
						throw Riccsson::System::NotImplementedException();
					}
					private: PROP3_SET(int, Revision){throw;}

					public: PROP3_GET(int, SubSystemId)
					{
						throw Riccsson::System::NotImplementedException();
					}
					private: PROP3_SET(int, SubSystemId){throw;}

					private: GC_PTR<DisplayModeCollection> supportedDisplayModes; // = null;
        
					public: PROP3_GET(GC_PTR<DisplayModeCollection>, SupportedDisplayModes)
					{
						throw;
					}
					private: PROP3_SET(GC_PTR<DisplayModeCollection>, SupportedDisplayModes){throw;}

					public: PROP3_GET(int, VendorId)
					{
						throw Riccsson::System::NotImplementedException();
					}
					private: PROP3_SET(int, VendorId){throw;}
				};
			}
		}
	}
}

#endif